package cn.icanci.rec.engine.script;

import cn.icanci.rec.common.enums.ScriptTypeEnum;
import cn.icanci.rec.engine.script.context.RecScriptEngineContext;

import javax.script.Bindings;

/**
 * 脚本执行引擎抽象顶级接口
 * 
 * @author icanci
 * @since 1.0 Created in 2022/11/12 22:12
 */
public interface RecScriptEngine {
    /**
     * 执行脚本
     *
     * @param scriptType 脚本类型
     * @param script 脚本内容
     * @return 脚本执行返回上下文
     */
    RecScriptEngineContext<Object> eval(ScriptTypeEnum scriptType, String script);

    /**
     * 执行脚本
     *
     * @param scriptType 脚本类型
     * @param bindings 脚本运行时参数
     * @param script 脚本内容
     * @return 脚本执行返回上下文
     */
    RecScriptEngineContext<Object> eval(ScriptTypeEnum scriptType, Bindings bindings, String script);

    /**
     * 执行脚本
     *
     * @param scriptType 脚本类型
     * @param script 脚本内容
     * @param clazz 脚本执行返回类型
     * @param <T> 泛型
     * @return 脚本执行返回上下文
     */
    <T> RecScriptEngineContext<T> eval(ScriptTypeEnum scriptType, String script, Class<T> clazz);

    /**
     * 执行脚本
     *
     * @param scriptType 脚本类型
     * @param bindings 脚本运行时参数
     * @param script 脚本内容
     * @param clazz 脚本执行返回类型
     * @param <T> 泛型
     * @return 脚本执行返回上下文
     */
    <T> RecScriptEngineContext<T> eval(ScriptTypeEnum scriptType, Bindings bindings, String script, Class<T> clazz);

}
